package annotation;

import org.springframework.context.annotation.*;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.type.AnnotatedTypeMetadata;

/**
 * @author jackcfan
 * @date 2021/10/1
 */
@Configuration
public class ProfileAndConditionTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(ProfileAndConditionTest.class);

        // 方法1：
        // 通过 API 设置 profile
        // 获取 Environment 对象（可配置的）
        ConfigurableEnvironment environment = context.getEnvironment();
        // 默认 profiles = [ "dev" ] （兜底 profiles)
        environment.setDefaultProfiles("dev");
        // 增加活跃 profiles
        environment.addActiveProfile("prd");

        // 方法2：
        // 通过启动参数设置 profile
        // --spring.profiles.active=prd
        // -Dspring.profiles.active=prd

        // 启动 Spring 应用上下文
        context.refresh();

        String username = context.getBean("username", String.class);

        System.out.println("username="+username);

        context.close();
    }

    /**
     * Profile： spring 内置的 Condition {@link ProfileCondition}
     * @Profile -> @Conditional(ProfileCondition.class)
     * */
    @Profile("dev") // 开发环境

    @Bean(name = "username")
    public String dev() {
        return "dev_user";
    }

    /**
     * 判断实现
     * @see ConditionEvaluator#shouldSkip(AnnotatedTypeMetadata, ConfigurationCondition.ConfigurationPhase)
     * */
    // @Profile("prd")
    // @Conditional(Condition.class) 返回 true 成立
    @Conditional(PrdProfileCondition.class) // 生产环境
    @Bean(name = "username")
    public String even() {
        return "prd_user";
    }

    static class PrdProfileCondition implements Condition{
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return context.getEnvironment().acceptsProfiles("prd");
        }
    }
}
